import matplotlib.pyplot as plt
import numpy as np

x = 0
y = 0


# 以下是AI提供的思路
def solve_linear_system(a1, b1, m1, a2, b2, m2):
    """
    解二元一次方程组:
        a1 * x + b1 * y = m1
        a2 * x + b2 * y = m2

    参数：
        a1, b1, c1 (numbers): 第一个方程的系数
        a2, b2, c2 (numbers): 第二个方程的系数

    返回：
        tuple: (x, y) 解的坐标，如果没有解或有无穷多解，则返回 None
    """

    # 创建增广矩阵并计算其行列式
    global x
    global y
    det = a1 * b2 - a2 * b1

    if det == 0:
        return None  # 方程组线性相关，无唯一解

    # 使用加减消元法求解
    x = (m1 * b2 - m2 * b1) / det
    y = (a1 * m2 - a2 * m1) / det

    return (x, y)


print("这是一个可以帮助用户求解二元一次方程组的程序")
print("请按照( )x+( )y=( )的顺序输入参数")
print("注意！本程序仅适用于求解系数为 整数和不循环小数 的方程")
## 进入第一层循环：确定方程各项系数
while (True):
    a1, b1, m1 = input("请输入第一式的各项参数(使用空格分隔开)：").split()
    a2, b2, m2 = input("请输入第一式的各项参数(使用空格分隔开)：").split()
    a1 = float(a1)
    b1 = float(b1)
    m1 = float(m1)
    a2 = float(a2)
    b2 = float(b2)
    m2 = float(m2)
    print("\n现在系数确定完毕，以下是您所输入的方程预览：")
    print(str(a1) + " x+ " + str(b1) + " y =" + str(m1))
    print(str(a2) + " x+ " + str(b2) + " y =" + str(m2))
    ## 进入第二层循环：向用户确认方程系数
    while (True):
        print("这是不是您所希望求解的方程，请输入Y/N")
        in_comtent = input("请输入：")
        if in_comtent == "Y":
            break
        elif in_comtent == "N":
            print("请重新再输入一次……")
            break
        else:
            print("你输入有误，请重试。")
    if in_comtent == "Y":
        break
## 开始求解
solution = solve_linear_system(a1, b1, m1, a2, b2, m2)
if solution is not None:
    print("解为：x =", solution[0], "y =", solution[1])
else:
    print("方程组无唯一解")
print("求解完成")
## 验证解的正确性
if a1 * x + b1 * y == m1 and a2 * x + b2 * y == m2:
    print("求解结果正确")
else:
    if a1 / a2 == b1 / b2:
        print("求解结果正确")
    else:
        print("求解错误，请尝试重新运行程序或向开发者反馈")
        exit


def DrawFunction(FunX, FunY, a, b, m):
    x = np.linspace(FunX - 10, FunX + 10, 50)
    y = (m - a * x) / b
    plt.figure(num=3, figsize=(8, 5))
    plt.plot(x, y, color='red', linewidth=1.0, linestyle='--')
    plt.xlim(FunX - 20, FunX + 20)
    plt.ylim(FunY - 20, FunY + 20)
    plt.xlabel('x')
    plt.ylabel('y')
    new_ticks = np.linspace(FunX - 20, FunX + 20, 40)
    plt.xticks(new_ticks)


while (True):
    print("您是否想要进行函数图像绘制 Y/N")
    in_comtent = input("请输入：")
    if in_comtent == "Y":
        DrawFunction(x, y, a1, b1, m1)
        DrawFunction(x, y, a2, b2, m2)
        plt.show()
        break
    elif in_comtent == "N":
        break
    else:
        print("你输入有误，请重试。")

input("\n按回车键退出")
